B03【多链路问题】环路、广播风暴、链路聚合
回顾交换过程
一般的交换机是二层设备,负责转发数据帧;只会解封装数据帧,获取源mac与目标mac,对数据帧的转发就是基于mac地址的。
收到一个数据帧:
读取到源mac地址,就进行学习——记录在交换机内部的地址表中。
读取到目标地址,如果内部地址表中有该mac地址的信息,就根据表格指定的接口转发出去。
读取到目标地址,如果内部地址表中没有该mac地址的信息,就从其他所有接口转发出去;等目标设备回包了自然就能通过读取源mac学习到。
如果目标地址为全f,也就是广播地址,就会从所有接口直接转发出去(比如ARP包)
环路与广播风暴
环路
环路是指交换机之间的链路形成了一个圈、一个循环。
可以是多台交换机彼此串联,最后形成一个圆环;也可以是两台交换机之间有多条链路互联;甚至可以是一台交换机同时连在网线的头尾。
现网中常出现的情况有两种:
一是机房到办公区拉了多条网线(其中有作为备用的),备用的网线在机房已经接上交换机,在办公区这边只是打上水晶头未接上。某天有人将这条网线接上交换机的话,就形成环路了。(图中第二种)
二是办公区的交换机连了多台设备,有设备移动了,网线还留在交换机上。某天有人将这条因设备移动、未连接设备的网线接回交换机的话,就形成环路了。(图中第三种)
如果形成环路的交换机之间有广播包存在,那么该广播包将无限制的循环下去。
广播风暴
比如图中PC1想访问PC2,由于不知道PC2的mac地址,于是发送了ARP广播包。
基于广播特性,交换机2收到ARP包时会转发给交换1与3,交换机1再转发给交换机3,在交换机3这就一共有2份广播包了,最终PC2会收到2份广播包。(指单方向的一次通信,图中绿色箭头)
实际上交换机3分别收到交换机1与2发来的广播包,不会只发给PC2,也会转发到另一台交换机(图中红色箭头)。
最终这两红箭头的广播包就会一直转发下去,在环路中形成一个“顺时针”与一个“逆时针”方向的“圈”。
另外对于PC1与PC2来说,也会收到无限多的该广播包。
这就是广播风暴。
设备越多,形成环路后造成的广播风暴就越猛烈,很快就会导致网络资源被占满,导致一般的网络通信无法正常进行。
另外,基于交换机的mac地址学习机制——收到数据帧会学习记录数据帧的源mac地址。
以上述拓扑为例,对其中任何交换机来说,当他们收到“顺时针方向”的数据帧,就会记录PC1的mac地址来自于此;可收到“逆时针方向”的数据帧时,就又检测到PC1的mac地址来自于这另一个接口。
最终这个mac在交换机的地址表中,表现为在两个接口之间反复切换,这种现象被称为为mac地址漂移、或mac地址震荡。
这种现象会导致在广播风暴的初期——网络资源还未被完全消耗时,就出现网络时断时续的情况。
预防措施
一是对备用线缆做好标签,最好是不打水晶头,需要时再打水晶头。
二是做好管理教育,普通员工不要碰网络设备,哪怕是不小心撞到了,以为自己把网线碰松掉下来了,也不要自己接回去。(等有人上不了网报障了,运维人员再去处理。)
三是在可网管的交换机设备开启STP一类的防环路功能。(STP的内容在另一篇文章详细介绍)
衍生
我们辩证的看一下环路,其还是能存在优点的。
就上面的拓扑图,假如这三台交换机之间某一条链路故障了,并不会造成局部网络不通,PC1与PC2依旧能访问到任何一台交换机。
如果是两台交换机之间存在环路(图1的第二种环路情况),一样也能保证单条链路故障后,依旧有链路能访问;甚至可以考虑同时使用这两条链路来收发数据,实现带宽的翻倍,网络性能的优化。
后面将介绍两种技术——链路聚合、生成树协议,就能实现以上功能,且不会造成广播风暴。
打算一口气介绍完STP与RSTP,碍于篇幅,STP与RSTP本文暂不介绍,所以先介绍链路聚合技术。
链路聚合
以太网链路聚合Eth-Trunk简称链路聚合,通过将多个物理接口捆绑为一个逻辑接口,可以在不进行硬件升级的条件下,达到增加链路带宽的目的。
链路聚合技术主要有以下三个优势:
增加带宽
链路聚合接口的最大带宽可以达到各成员接口带宽之和。(比如千兆交换机,原本只有1条链路时只能跑千兆;链路聚合3条链路的话就可以跑到三千兆。)
提高可靠性
当某条活动链路出现故障时,流量可以切换到其他可用的成员链路上,从而提高链路聚合接口的可靠性。(链路聚合了3条链路,其中一条链路故障了,其他2条还正常,所以不影响通信。)
负载分担
在一个链路聚合组内,可以实现在各成员活动链路上的负载分担。(聚合了3条链路,同时进行收发,将数据流量分摊。)
注:链路聚合后,针对接口的配置只需要在链路聚合接口下直接配置即可。
基础配置
- 执行命令system-view,进入系统视图。
- 执行命令interface eth-trunk trunk-id,创建Eth-Trunk接口,并进入Eth-Trunk接口视图。
- 执行命令trunkport interface-type interface-number1,增加成员接口,可批量添加,规则同批量添加vlan一样。
将成员接口加入Eth-Trunk后,需要注意以下问题:
- 一个以太网接口只能加入到一个Eth-Trunk接口,如果需要加入其它Eth-Trunk接口,必须先退出原来的Eth-Trunk接口。
- 当成员接口加入Eth-Trunk后,学习MAC地址或ARP地址时是按照Eth-Trunk来学习的,而不是按照成员接口来学习。
- 删除聚合组时需要先删除聚合组中的成员接口,另外切换接口类型/模式需要清空接口配置。
聚合接口创建之后,对于交换机来说,这就是一个普通的接口,可以在该Eth-Trunk接口视图直接进行常规的配置(比如vlan)。
在交换机的内部地址表中,也只会显示为Eth-Trunk接口。
小案例——手工模式
以上图拓扑为例,交换机1与交换机2之间使用3条链路连接。
因为接口号都一样,两台交换机上都使用以下命令进行配置
interface Eth-Trunk 1
trunkport g 0/0/1 to 0/0/3
再执行命令dis eth-trunk trunk-id查看接口信息。
1 | [magiku]dis eth-trunk 1 |
非常的简单,三个接口都加入聚合组了,完成了链路聚合。
使用几台PC互相通信后,再查看交换机的地址表。
1 | [SW1]display mac-address |
1 | [SW2]display mac-address |
可以看到mac地址对应的接口显示为聚合接口Eth-Trunk1,对交换机来说,已经不存g0/0/1 g0/0/2 g0/0/3这三个接口了。
手工模式的注意事项
以上这种配置方式为手工模式(还有一些可选命令就不介绍了),手动模式因其灵活性差,目前已很少使用。
手工模式不感知对端设备,可能交换机1聚合的链路中有一条被接到其他的设备,而不是交换机2;对于交换机1来说,它并不知道。
在上图示例中SW1将四个接口加入到同一个聚合接口,但是其中一个接口的对端为SW3,而不是SW2,导致部分流量被负载分担到SW3,从而导致通信异常。
手工模式下,只感知自身的接口状态,如果链路中间有其他设备提供了链路状态(简单来说就是交换机接口亮灯),那么实际出现故障后,另一端交换机也感知不到异常。(比如电口交换机与光口交换机做链路聚合,中间使用了光电转换器;当一侧交换机接口故障时,由于光电转换器到另一端的交换机还是保持链路的,所以该交换机依旧以为聚合链路正常。)
因此,配置手工模式需要注意一个聚合接口的所有成员接口,其链路的另一头接口必须属于同一台设备,且属于同一个聚合接口。
(一个交换机可创建多个聚合接口,所有要保证在一个聚合接口中)
为解决手工模式的缺陷,人们便考虑让聚合接口之间进行协议通信,交流彼此接口信息,这种新的配置模式就是LACP。
LACP模式的链路聚合
手工模式与LACP模式的对比
维度 | 手工模式 | LACP模式 |
---|---|---|
Eth-Trunk的建立方式 | Eth-Trunk的建立、成员接口的加入由手工配置, 没有链路聚合控制协议的参与。 |
Eth-Trunk的建立是基于LACP协议的, LACP为交换数据的设备提供一种标准的协商方式, 以供系统根据自身配置自动形成聚合链路并启动聚合链路收发数据。 聚合链路形成以后,负责维护链路状态。 在聚合条件发生变化时,自动调整或解散链路聚合。 |
设备是否需要支持LACP协议 | 不需要 | 需要 |
数据转发 | 正常情况下,所有链路都是活动链路。 如果某条活动链路故障,链路聚合组自动在剩余的活动链路中分担流量。 |
正常情况下,部分链路是活动链路。 如果某条活动链路故障,链路聚合组自动在非活动链路中选择一条链路作为活动链路,参与数据转发的链路数目不变。 |
是否支持跨设备的链路聚合 | 不支持 | 支持 |
检测故障 | 只能检测到同一聚合组内的成员链路有断路等有限故障,但是无法检测到链路断连、错连等故障。 | 不仅能够检测到同一聚合组内的成员链路有断路等有限故障,还可以检测到链路故障、链路错连等故障。 |
所谓的活动链路就是指投入使用,负责数据转发的链路的。
手工模式默认所有链路都负责收发数据,LACP模式下可自定义启用多少条链路。
配置LACP模式的链路聚合
执行命令system-view,进入系统视图。
执行命令interface eth-trunk trunk-id,创建并进入Eth-Trunk接口视图。
执行命令mode lacp,配置Eth-Trunk的工作模式为LACP。
不执行此命令时,工作模式默认为手工模式,正常配置为手工模式的命令为mode manual load-balance。
配置时需要保证本端和对端的聚合模式一致。即如果本端配置为LACP模式,那么对端设备也必须要配置为LACP模式。
执行命令trunkport interface-type interface-number,增加成员接口。
(可选)执行命令max active-linknumber link-number,配置链路聚合活动接口数上限阈值。
- 不执行此命令时,默认上限需要看设备型号,一般至少大于4。
- 如果要执行此命令,最好本端和对端都做相同的修改。
一般执行以上命令就可以完成配置了,但还有两个信息可做修改,一个是优先级,另一个是负载分担方式。
在给出命令之前,得先学习一下什么是lacp的优先级与负载分担。
LACP优先级
系统优先级
在lacp模式下,链路分活动链路与非活动链路(备用的不启用的链路)。如果交换机1选择链路1与2所在的接口为活动接口,交换机2链路3与4所在的接口为活动接口,这就会导致聚合链路的构建失败。
因此引入了系统LACP优先级的概念,优先级高的设备为主动端。
主动端选择好什么接口为活动接口,也就意味着活动链路确定了,于是优先级低的被动端就依此确定其活动接口。
系统LACP优先级默认32768,越小越优,通常保持默认。
当优先级—致时LACP会通过比较MAC地址选择主动端,MAc地址越小越优。
操作步骤:
- 执行命令system-view,进入系统视图。
- 执行命令lacp priority number,配置当前设备的系统LACP优先级。
接口优先级
系统优先级是选出主动端与被动端,而接口优先级则是选出活动接口与非活动接口。
接口LACP优先级默认为32768,越小越优,通常保持默认。
当优先级—致时LACP会通过接口编号选择活动接口,越小越优。
操作步骤:(注意是进入物理接口修改)
- 执行命令system-view,进入系统视图。
- 执行命令interface interface-type interface-number,进入接口视图。
- 执行命令lacp priority number,配置当前接口的LACP优先级。
接口抢占功能与其延时时间
开启LACP抢占功能可以保持接口LACP优先级最高的接口为活动接口。
当一条高优先级的接口因故障切换为非活动状态而后又恢复时;
如果开启了抢占,则高优先级的接口将重新成为活动接口;
如果未开启抢占,该接口不能重新成为活动接口。
抢占延时即抢占等待时间,是指在LACP模式的Eth-Trunk中非活动接口切换为活动接口需要等待的时间。
配置抢占延时可以避免由于某些链路状态频繁变化而导致Eth-Trunk数据传输不稳定的情况。
操作步骤
执行命令system-view,进入系统视图。
执行命令interface eth-trunk trunk-id,进入Eth-Trunk接口视图。
执行命令lacp preempt enable,开启当前Eth-Trunk接口的LACP抢占功能。
默认情况下,LACP抢占处于关闭状态。
为保证Eth-Trunk正常工作,要求Eth-Trunk两端统一配置LACP抢占开启或关闭。
执行命令lacp preempt delay delay-time,配置当前Eth-Trunk接口的LACP抢占等待时间。
默认情况下,LACP抢占等待时间为30秒。
当链路两端设备配置的抢占等待时间不一致时,以等待时间最长的作为实际抢占等待时间。
负载分担
在使用Eth-Trunk转发数据时,由于聚合组两端设备之间有多条物理链路;
可能会产生同一数据流的第一个数据帧在一条物理链路上传输,而第二个数据帧在另外一条物理链路上传输的情况。
这样一来同一数据流的第二个数据帧就有可能比第一个数据帧先到达对端设备,从而产生接收数据包乱序的情况。
为了避免这种情况的发生,Eth-Trunk采用逐流负载分担的机制。
把数据帧中的地址通过HASH算法生成HASH-KEY值,然后根据这个数值在Eth-Trunk转发表中寻找对应的出接口。
不同的MAC或IP地址HASH得出的HASH-KEY值不同,从而出接口也就不同;源目地址不变的同一数据流,其出接口就保持为同一个。
这样既保证了同一数据流的帧在同一条物理链路转发,又实现了流量在聚合组内各物理链路上的负载分担。
逐流负载分担能保证包的顺序,但不能保证带宽利用率。
Eth-trunk支持基于报文的IP地址或MAc地址来进行负载分担,可以配置不同的模式将数据流分担到不同的成员接口上。
常见的模式有:源lP、源MAc、目的IlP、目的MAc、源IP+目的IP、源MAC+目的MAC,共6种。
实际业务中用户需要根据业务流星特征选择配置合适的负载分担方式。业务流量中某种参数变化越频繁,选择与此参数相
关的负载分担方式就越容易实现负载均衡。
图中这种数据流可能发生在两台路由器间。
默认的负载分担方式为源IP+目的IP,可适用于大多数场景,一般不需要做修改。
操作步骤
执行命令system-view,进入系统视图。
执行命令interface eth-trunk trunk-id,进入Eth-Trunk接口视图。
执行命令load-balance ? ,配置Eth-Trunk负载分担方式。(从下方参数6选1)
参数 说明 dst-ip 根据目的IP进行哈希算法 dst-mac 根据目的MAC进行哈希算法 src-dst-ip 根据源IP+目的IP进行哈希算法 src-dst-mac 根据源MAC+目的MAC进行哈希算法 src-ip 根据源IP进行哈希算法 src-mac 根据源MAC进行哈希算法
注:手工模式也可以配置负载分担。
综合实验
就图例拓扑,进行LACP模式链路聚合的配置,同时再配上vlan。
路由器的0、1、2口与交换机1的1、2、3口进行链路聚合。活动2条,备用1条。
交换机2处于vlan10 10.1.1.0/24,且1、2口与交换机1的4、5口链路聚合。活动1条,备用1条。
交换机3处于vlan20 20.1.1.0/24,且1、2口与交换机1的6、7口链路聚合。活动1条,备用1条。
先完成底下交换部分的配置:
对于交换机2,进行如下配置
1 | system-view |
对于交换机3,进行如下配置
1 | system-view |
交换机1进行如下配置,以完成交换机之间的通信:
1 | system-view |
经过以上配置,PC1与PC2即可通信。聚合的链路只启用一条,另外一条作为备用。
对于路由器R1,其配置为
1 | system-view |
ip route-static命令为配置静态路由,有关这部分的内容之后会单独介绍,目前这么配置即可。
对于路由器而言,配置链路聚合接口后需要使用undo portswitch命令切换接口层级,否则无法添加接口成员。
则交换机1再追加以下配置
1 | interface Eth-Trunk 0 |
Eth-Trunk默认vlan接口类型为hybrid。其次所有交换机接口vlan默认为vlan1。因此可直接创建vlan1的vlanif接口,配置ip地址。
以上配置完之后,PC1、PC2、交换机1、路由器1就都可以互相访问了。聚合链路也都保持着1条备用的非活动链路。
其他
ensp模拟器与真机是存在差距的,真机中聚合链路的活动链路故障后,切换为其他链路是很快的,几乎感受不到网络的异常。
实验没有带着一行一行命令进行解释是希望各位能翻着看之前的命令介绍,同时多动手敲一敲。
另外关于链路聚合的原理,个人觉得不是很重要,所以没有介绍,有兴趣的话,可以自行查阅学习。